﻿using AppForm_Managers.Object_Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AppForm_Managers.Views
{
    public partial class SalaryLevelForm : Form
    {
        public SalaryLevelForm()
        {
            InitializeComponent();
        }

        private void SalaryLevelForm_Load(object sender, EventArgs e)
        {
            ErrorProvider.Dispose();

            UpdateButton.Enabled = false;
            DeleteButton.Enabled = false;
            AddButton.Enabled = true;
        }

        private void GridLevelSalary_Load(object sender, EventArgs e)
        {
            using (ManagerEmployeesEntities db = new ManagerEmployeesEntities())
            {
                GridLevelSalary.DataSource = db.SalaryLevels.ToList();
            }
        }

        private void ViewLevelSalary_Click(object sender, EventArgs e)
        {
            Notifications.Text = "";
            Notifications.Visible = false;
            ErrorProvider.Dispose();

            List<int> listSelected = ViewLevelSalary.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }

            if (index > -1)
            {
                UpdateButton.Enabled = true;
                DeleteButton.Enabled = true;
                AddButton.Enabled = false;

                CodeSalaryText.Text = ViewLevelSalary.GetRowCellValue(index, "Code").ToString();
                NameSalaryText.Text = ViewLevelSalary.GetRowCellValue(index, "NameOfSalary").ToString();
                LevelSalaryText.Text = ViewLevelSalary.GetRowCellValue(index, "LevelSalary").ToString();
                NumberSalaryText.Text = ViewLevelSalary.GetRowCellValue(index, "NumberSalary").ToString();
                DesText.Text = ViewLevelSalary.GetRowCellValue(index, "Descriptons").ToString();
                CheckStatus.Checked = bool.Parse(ViewLevelSalary.GetRowCellValue(index, "StatusOfLevel").ToString());

            }
        }

        private void Controls_Reset()
        {
            CodeSalaryText.Text = "";
            NameSalaryText.Text = "";
            LevelSalaryText.Text = "";
            NumberSalaryText.Text = "";
            DesText.Text = "";
            CheckStatus.Checked = false;

            AddButton.Enabled = true;
            UpdateButton.Enabled = false;
            DeleteButton.Enabled = false;
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            ErrorProvider.Dispose();
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                if (CodeSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(CodeSalaryText, "Mã ngạch không được để trống");
                    CodeSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (NameSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(NameSalaryText, "Tên ngạch không được để trống");
                    NameSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (LevelSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(LevelSalaryText, "Bậc lương không được để trống");
                    LevelSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (NumberSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(NumberSalaryText, "Hệ số lương không được để trống");
                    NumberSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (DesText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(DesText, "Mô tả không được để trống");
                    DesText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                float levelSalary = 0;
                try
                {
                    levelSalary = float.Parse(LevelSalaryText.Text.Trim());
                    if (levelSalary < 0)
                    {
                        ErrorProvider.SetError(LevelSalaryText, "Bậc lương phải là một số lớn hơn 0");
                        LevelSalaryText.Focus();
                        return;
                    }
                    else
                        ErrorProvider.Dispose();
                }
                catch (Exception)
                {
                    ErrorProvider.SetError(LevelSalaryText, "Bậc lương phải là số");
                    LevelSalaryText.Focus();
                    return;
                }


                float numberOfSalary = 0.2F;
                try
                {
                    numberOfSalary = float.Parse(NumberSalaryText.Text.Trim());
                    if (numberOfSalary < 0)
                    {
                        ErrorProvider.SetError(NumberSalaryText, "Hệ số lương phải là một số lớn hơn 0");
                        NumberSalaryText.Focus();
                        return;
                    }
                    else
                        ErrorProvider.Dispose();
                }
                catch (Exception)
                {
                    ErrorProvider.SetError(NumberSalaryText, "Hệ số lương phải là số");
                    NumberSalaryText.Focus();
                    return;
                }

                foreach (var item in db.SalaryLevels)
                {
                    if (item.Code.ToLower().Equals(CodeSalaryText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(CodeSalaryText, "Mã ngạch đã tồn tại, hãy nhập mã khác.");
                        CodeSalaryText.Focus();
                        return;
                    }

                    if (item.NameOfSalary.ToLower().Equals(NameSalaryText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(NameSalaryText, "Tên ngạch đã tồn tại, hãy nhập mã khác.");
                        NameSalaryText.Focus();
                        return;
                    }
                }

                SalaryLevel sl = new SalaryLevel()
                {
                    Code = CodeSalaryText.Text.Trim(),
                    NameOfSalary = NameSalaryText.Text.Trim(),
                    LevelSalary = levelSalary.ToString(),
                    NumberSalary = numberOfSalary.ToString(),
                    Descriptons = DesText.Text.Trim(),
                    StatusOfLevel = CheckStatus.Checked

                };
                db.SalaryLevels.Add(sl);
                db.SaveChanges();

                ErrorProvider.Dispose();
                Controls_Reset();
                GridLevelSalary_Load(sender, e);
                AlertControl.Show(this, "Hệ thống thông báo", "Thêm mới một nghạch lương thành công");
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy quay lại sau", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            Notifications.Visible = true;
            Notifications.Text = "";
            ErrorProvider.Dispose();

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();

            try
            {
                if (CodeSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(CodeSalaryText, "Mã ngạch không được để trống");
                    CodeSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (NameSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(NameSalaryText, "Tên ngạch không được để trống");
                    NameSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (LevelSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(LevelSalaryText, "Bậc lương không được để trống");
                    LevelSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (NumberSalaryText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(NumberSalaryText, "Hệ số lương không được để trống");
                    NumberSalaryText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                if (DesText.Text.Trim().Length == 0)
                {
                    ErrorProvider.SetError(DesText, "Mô tả không được để trống");
                    DesText.Focus();
                    return;
                }
                else
                    ErrorProvider.Dispose();

                float levelSalary = 0;
                try
                {
                    levelSalary = float.Parse(LevelSalaryText.Text.Trim());
                    if (levelSalary <= 0)
                    {
                        ErrorProvider.SetError(LevelSalaryText, "Bậc lương phải là một số lớn hơn 0");
                        LevelSalaryText.Focus();
                        return;
                    }
                    else
                        ErrorProvider.Dispose();
                }
                catch (Exception)
                {
                    ErrorProvider.SetError(LevelSalaryText, "Bậc lương phải là số");
                    LevelSalaryText.Focus();
                    return;
                }


                float numberOfSalary = 0.2F;
                try
                {
                    numberOfSalary = float.Parse(NumberSalaryText.Text.Trim());
                    if (numberOfSalary <= 0)
                    {
                        ErrorProvider.SetError(NumberSalaryText, "Hệ số lương phải là một số lớn hơn 0");
                        NumberSalaryText.Focus();
                        return;
                    }
                    else
                        ErrorProvider.Dispose();
                }
                catch (Exception)
                {
                    ErrorProvider.SetError(NumberSalaryText, "Hệ số lương phải là số");
                    NumberSalaryText.Focus();
                    return;
                }

                List<int> listSelected = ViewLevelSalary.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }
                int saId = 0;
                if (index > -1)
                {

                    saId = int.Parse(ViewLevelSalary.GetRowCellValue(index, "SaLevID").ToString());
                }

                foreach (var item in db.SalaryLevels)
                {
                    if (item.Code.ToLower().Equals(CodeSalaryText.Text.Trim().ToLower())
                        && item.SaLevID != saId)
                    {
                        Notifications.Text = "Mã ngạch đã tồn tại, hãy nhập mã khác.";
                        Notifications.Visible = true;
                        ErrorProvider.SetError(CodeSalaryText, "Mã ngạch đã tồn tại, hãy nhập mã khác.");
                        CodeSalaryText.Focus();
                        Notifications.ForeColor = Color.OrangeRed;
                        return;
                    }

                    if (item.NameOfSalary.ToLower().Equals(NameSalaryText.Text.Trim().ToLower())
                        && item.SaLevID != saId)
                    {
                        Notifications.Text = "Tên ngạch đã tồn tại, hãy nhập mã khác.";
                        Notifications.Visible = true;
                        ErrorProvider.SetError(NameSalaryText, "Tên ngạch đã tồn tại, hãy nhập mã khác.");
                        NameSalaryText.Focus();
                        Notifications.ForeColor = Color.OrangeRed;
                        return;
                    }

                }

                SalaryLevel sl = db.SalaryLevels.Single(s => s.SaLevID == saId);
                sl.Code = CodeSalaryText.Text.Trim();
                sl.NameOfSalary = NameSalaryText.Text.Trim();
                sl.LevelSalary = LevelSalaryText.Text.Trim();
                sl.NumberSalary = NumberSalaryText.Text.Trim();
                sl.Descriptons = DesText.Text.Trim();
                sl.StatusOfLevel = CheckStatus.Checked;

                if (MessageBox.Show("Bạn có muốn thay đổi thông tin?", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    ErrorProvider.Dispose();
                    Controls_Reset();
                    GridLevelSalary_Load(sender, e);
                    AlertControl.Show(this, "Hệ thống thông báo", "Thay đổi thông tin ngạch lương thành công.");
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy quay lại sau", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void DeleteButton_Click(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();

            try
            {
                List<int> listSelected = ViewLevelSalary.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }
                int saId = 0;
                if (index > -1)
                {

                    saId = int.Parse(ViewLevelSalary.GetRowCellValue(index, "SaLevID").ToString());
                }
                SalaryLevel sl = db.SalaryLevels.Single(s => s.SaLevID == saId);
                foreach (var item in sl.EmployeesSalaryLevels)
                {
                    db.EmployeesSalaryLevels.Remove(item);
                }

                db.SalaryLevels.Remove(sl);

                if (MessageBox.Show("Bạn có muốn xóa ngạch lương này?", "Xóa ngạch lương", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    ErrorProvider.Dispose();
                    Controls_Reset();
                    GridLevelSalary_Load(sender, e);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy quay lại sau", "Hệ thống thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void CancelsButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn hủy bỏ thông tin và làm mới?", "Hủy bỏ thông tin và làm mới", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Controls_Reset();
            }
        }
    }
}
